﻿CREATE SCHEMA pca_guias;

CREATE TABLE pca_guias.estado_guia
(
	estado_guia_id varchar(2) NOT NULL,
	nombre varchar(50) NOT NULL,
	CONSTRAINT estado_guia_pk PRIMARY KEY(estado_guia_id)
);

CREATE TABLE pca_guias.motivos_guia_remision_remitente
(
	nombre varchar(200) NOT NULL,
	CONSTRAINT motivos_guia_remision_remitente_pk PRIMARY KEY(nombre)
);

------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------Guia de Remision Remitente ----------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------

CREATE SEQUENCE pca_guias.seq_guia_remision_remitente_id;
CREATE TABLE pca_guias.guias_remision_remitente
(
	guia_remision_remitente_id bigint NOT NULL DEFAULT pca_global.fn_pseudo_encrypt_bigint(nextval('pca_guias.seq_guia_remision_remitente_id')::integer),
	sesion_id bigint NOT NULL,
	oficina_id varchar(2) NOT NULL,
	empresa_id varchar(2) NOT NULL,
	serie integer NOT NULL,
	numero integer NOT NULL,
	comprobante_id bigint,
	fecha_traslado timestamp with time zone NOT NULL,
	fecha_hora_sistema timestamp with time zone NOT NULL DEFAULT current_timestamp,
	num_doc_identidad_destinatario varchar(20) NOT NULL,--Documento del destinatario
	nombre_destinatario varchar(200) NOT NULL,
	punto_partida varchar(200) NOT NULL,
	punto_llegada varchar(200) NOT NULL,
	motivo_traslado varchar(200) NOT NULL,
	num_doc_identidad_transportista varchar(20),--transporte publico
	nombre_transportista varchar(200),--transporte publico
	marca_placa varchar(100),--llenar en caso de transporte privado
	licencia_conducir varchar(100),--llenar en caso de transporte privado
	estado_guia_id varchar(2) NOT NULL,
	precios_incluyen_igv boolean NOT NULL,
	val_igv numeric(4,2) NOT NULL,--% de Igv
	moneda_id varchar(5) NOT NULL,
	importe_bruto numeric(11,3) NOT NULL DEFAULT 0,
	descuento numeric(11,3) NOT NULL DEFAULT 0,
	valor_venta numeric(11,3) NOT NULL DEFAULT 0,
	impuesto numeric(11,3) NOT NULL DEFAULT 0,
	precio_venta numeric(11,3) NOT NULL DEFAULT 0,
	tipo_cambio_emision numeric(4,2) NOT NULL,
	observaciones text,
	imprimir_precios boolean NOT NULL,
	CONSTRAINT guias_remision_remitente_pk PRIMARY KEY(guia_remision_remitente_id),
	CONSTRAINT sesiones_fkey FOREIGN KEY(sesion_id)
		REFERENCES pca_log.sesiones(sesion_id) MATCH SIMPLE
		ON UPDATE RESTRICT ON DELETE RESTRICT,
	CONSTRAINT oficinas_fkey FOREIGN KEY(oficina_id,empresa_id)
		REFERENCES  pca.oficinas(oficina_id,empresa_id) MATCH SIMPLE
		ON UPDATE RESTRICT ON DELETE RESTRICT,
	CONSTRAINT comprobantes_fkey FOREIGN KEY(comprobante_id)
		REFERENCES pca_ventas.comprobantes(comprobante_id) MATCH SIMPLE
		ON UPDATE RESTRICT ON DELETE RESTRICT,
	CONSTRAINT estado_guia_fkey FOREIGN KEY(estado_guia_id)
		REFERENCES pca_guias.estado_guia(estado_guia_id) MATCH SIMPLE
		ON UPDATE RESTRICT ON DELETE RESTRICT
);

CREATE SEQUENCE pca_guias.seq_detalle_guia_remision_remitente_id;
CREATE TABLE pca_guias.detalles_guias_remision_remitente
(
	detalle_id bigint NOT NULL DEFAULT pca_global.fn_pseudo_encrypt_bigint(nextval('pca_guias.seq_detalle_guia_remision_remitente_id')::integer),
	sesion_id bigint NOT NULL,
	guia_remision_remitente_id bigint NOT NULL,
	correlativo integer NOT NULL,
	articulo_id bigint,--el ID del articulo 
	codigo varchar(50),--el codigo del articulo o servicio si es que lo tiene
	cantidad numeric(11,3),
	medida varchar(10),
	peso varchar(20),
	descripcion text NOT NULL,
	precio_unitario numeric(11,3) NOT NULL,
	precio_costo numeric(11,3),--precio costo referencial del articulo
	precio_total numeric(11,3) NOT NULL,
	CONSTRAINT detalles_comprobante_pk PRIMARY KEY(detalle_id),
	CONSTRAINT sesiones_fkey FOREIGN KEY(sesion_id)
		REFERENCES pca_log.sesiones(sesion_id) MATCH SIMPLE
		ON UPDATE RESTRICT ON DELETE RESTRICT,
	CONSTRAINT guias_remision_remitente_fkey FOREIGN KEY(guia_remision_remitente_id)
		REFERENCES pca_guias.guias_remision_remitente(guia_remision_remitente_id) MATCH SIMPLE
		ON UPDATE RESTRICT ON DELETE RESTRICT,
	CONSTRAINT articulos_fkey FOREIGN KEY(articulo_id)
		REFERENCES pca_almacen.articulos(articulo_id) MATCH SIMPLE
		ON UPDATE RESTRICT ON DELETE RESTRICT
);

------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------Triggers--------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION pca_guias.fn_delete_references_guias_remision_remitente() RETURNS trigger AS
$$
BEGIN
	DELETE FROM pca_guias.detalles_guias_remision_remitente WHERE guia_remision_remitente_id = OLD.guia_remision_remitente_id;

	RETURN OLD;
END;
$$
LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS tri_delete_references_guias_remision_remitente ON pca_guias.guias_remision_remitente;
CREATE TRIGGER tri_delete_references_guias_remision_remitente BEFORE DELETE ON pca_guias.guias_remision_remitente
FOR EACH ROW
EXECUTE PROCEDURE pca_guias.fn_delete_references_guias_remision_remitente();

CREATE OR REPLACE FUNCTION pca_guias.fn_insert_detalle_guia_remision_remitente() RETURNS trigger AS
$$
BEGIN
	NEW.correlativo = currval('pca_guias.seq_detalle_guia_remision_remitente_id');
	RETURN NEW;
END;
$$
LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS tri_insert_detalle_guia_remision_remitente ON pca_guias.detalles_guias_remision_remitente;
CREATE TRIGGER tri_insert_detalle_guia_remision_remitente BEFORE INSERT ON pca_guias.detalles_guias_remision_remitente
FOR EACH ROW
EXECUTE PROCEDURE pca_guias.fn_insert_detalle_guia_remision_remitente();

----------------------------------------------------------------------------------------------------------------
---------------------------------------------DATOS DE INICIO----------------------------------------------------
----------------------------------------------------------------------------------------------------------------

DELETE FROM pca_guias.estado_guia;
INSERT INTO pca_guias.estado_guia VALUES('00','BORRADOR');
INSERT INTO pca_guias.estado_guia VALUES('01','ACTIVO');
INSERT INTO pca_guias.estado_guia VALUES('02','ELIMINADO');
INSERT INTO pca_guias.estado_guia VALUES('99','ANULADO');

INSERT INTO pca_guias.motivos_guia_remision_remitente VALUES('Venta');
INSERT INTO pca_guias.motivos_guia_remision_remitente VALUES('Compra');
INSERT INTO pca_guias.motivos_guia_remision_remitente VALUES('Consignación');
INSERT INTO pca_guias.motivos_guia_remision_remitente VALUES('Venta con entrega a terceros');
INSERT INTO pca_guias.motivos_guia_remision_remitente VALUES('Venta sujeta a confirmación del comprador');
INSERT INTO pca_guias.motivos_guia_remision_remitente VALUES('Traslados entre establecimientos de la misma empresa');
INSERT INTO pca_guias.motivos_guia_remision_remitente VALUES('Devolucion');
INSERT INTO pca_guias.motivos_guia_remision_remitente VALUES('Recojo de vienes');
INSERT INTO pca_guias.motivos_guia_remision_remitente VALUES('Importacion');
INSERT INTO pca_guias.motivos_guia_remision_remitente VALUES('Exportacion');
INSERT INTO pca_guias.motivos_guia_remision_remitente VALUES('Traslado zona primaria');
INSERT INTO pca_guias.motivos_guia_remision_remitente VALUES('Traslado por emisor itinerante de comprobate de pago');
INSERT INTO pca_guias.motivos_guia_remision_remitente VALUES('Traslado de bienes para transformacion');

----------------------------------------------------------------------------------------------------------------
-------------------------------------------------VISTAS---------------------------------------------------------
----------------------------------------------------------------------------------------------------------------

CREATE OR REPLACE VIEW pca_guias.vw_guias_remision_remitente AS
SELECT
	g.guia_remision_remitente_id,
	g.sesion_id,
	s.usuario_id,
	g.oficina_id,
	g.empresa_id,
	g.serie,
	g.numero,
	pca_global.fn_get_strserienumero(g.serie,g.numero) AS strserienumero,
	g.comprobante_id,
	g.fecha_traslado,
	g.fecha_hora_sistema,
	g.num_doc_identidad_destinatario,
	g.nombre_destinatario,
	g.punto_partida,
	g.punto_llegada,
	g.motivo_traslado,
	g.num_doc_identidad_transportista,
	g.nombre_transportista,
	g.marca_placa,
	g.licencia_conducir,
	g.estado_guia_id,
	g.precios_incluyen_igv,
	g.val_igv,
	g.moneda_id,
	m.nombre AS moneda,
	m.siglas AS moneda_siglas,
	g.importe_bruto,
	g.descuento,
	g.valor_venta,
	g.impuesto,
	g.precio_venta,
	g.tipo_cambio_emision,
	g.observaciones,
	g.imprimir_precios
FROM
	pca_guias.guias_remision_remitente g
INNER JOIN
	pca_tablas.monedas m
ON
	(g.moneda_id=m.moneda_id)
INNER JOIN
	pca_log.sesiones s
ON
	(g.sesion_id=s.sesion_id);